address space allocations in backend drivers.
Signed-off-by: Keir Fraser <keir@xensource.com>
if ( xen_override_max_pfn < xen_start_info->nr_pages )
xen_override_max_pfn = xen_start_info->nr_pages;
max_pfn = xen_override_max_pfn;
+ /* 8MB slack, to make up for address space allocations in backends. */
+ max_pfn += 8 << (20 - PAGE_SHIFT);
}
#endif /* XEN */
#endif
/* Make sure we have a correctly sized P->M table. */
- if (max_pfn != xen_start_info->nr_pages) {
- phys_to_machine_mapping = alloc_bootmem_low_pages(
- max_pfn * sizeof(unsigned long));
-
- if (max_pfn > xen_start_info->nr_pages) {
- /* set to INVALID_P2M_ENTRY */
- memset(phys_to_machine_mapping, ~0,
- max_pfn * sizeof(unsigned long));
- memcpy(phys_to_machine_mapping,
- (unsigned long *)xen_start_info->mfn_list,
- xen_start_info->nr_pages * sizeof(unsigned long));
- } else {
- struct xen_memory_reservation reservation = {
- .extent_start = (unsigned long *)xen_start_info->mfn_list + max_pfn,
- .nr_extents = xen_start_info->nr_pages - max_pfn,
- .extent_order = 0,
- .domid = DOMID_SELF
- };
-
- memcpy(phys_to_machine_mapping,
- (unsigned long *)xen_start_info->mfn_list,
- max_pfn * sizeof(unsigned long));
- BUG_ON(HYPERVISOR_memory_op(
- XENMEM_decrease_reservation,
- &reservation) !=
- (xen_start_info->nr_pages - max_pfn));
- }
- free_bootmem(
- __pa(xen_start_info->mfn_list),
- PFN_PHYS(PFN_UP(xen_start_info->nr_pages *
- sizeof(unsigned long))));
- }
-
+ phys_to_machine_mapping = alloc_bootmem_low_pages(
+ max_pfn * sizeof(unsigned long));
+ memset(phys_to_machine_mapping, ~0,
+ max_pfn * sizeof(unsigned long));
+ memcpy(phys_to_machine_mapping,
+ (unsigned long *)xen_start_info->mfn_list,
+ xen_start_info->nr_pages * sizeof(unsigned long));
+ free_bootmem(
+ __pa(xen_start_info->mfn_list),
+ PFN_PHYS(PFN_UP(xen_start_info->nr_pages *
+ sizeof(unsigned long))));
/*
* Initialise the list of the frames that specify the list of
{
unsigned long max_end_pfn = xen_start_info->nr_pages;
- if ( xen_override_max_pfn < max_end_pfn)
+ if ( xen_override_max_pfn < max_end_pfn)
xen_override_max_pfn = max_end_pfn;
-
- return xen_override_max_pfn;
+
+ /* 8MB slack, to make up for address space allocations in backends. */
+ xen_override_max_pfn += 8 << (20 - PAGE_SHIFT);
+
+ return xen_override_max_pfn;
}
void __init e820_reserve_resources(void)
static void __init contig_initmem_init(void)
{
unsigned long bootmap_size = init_bootmem(start_pfn, end_pfn);
- free_bootmem(0, end_pfn << PAGE_SHIFT);
+ free_bootmem(0, xen_start_info->nr_pages << PAGE_SHIFT);
reserve_bootmem(HIGH_MEMORY,
(PFN_PHYS(start_pfn) + bootmap_size + PAGE_SIZE-1)
- HIGH_MEMORY);
{
int i, j, k, fpp;
/* Make sure we have a large enough P->M table. */
- if (end_pfn > xen_start_info->nr_pages) {
- phys_to_machine_mapping = alloc_bootmem(
- end_pfn * sizeof(unsigned long));
- memset(phys_to_machine_mapping, ~0,
- end_pfn * sizeof(unsigned long));
- memcpy(phys_to_machine_mapping,
- (unsigned long *)xen_start_info->mfn_list,
- xen_start_info->nr_pages * sizeof(unsigned long));
- free_bootmem(
- __pa(xen_start_info->mfn_list),
- PFN_PHYS(PFN_UP(xen_start_info->nr_pages *
- sizeof(unsigned long))));
- }
+ phys_to_machine_mapping = alloc_bootmem(
+ end_pfn * sizeof(unsigned long));
+ memset(phys_to_machine_mapping, ~0,
+ end_pfn * sizeof(unsigned long));
+ memcpy(phys_to_machine_mapping,
+ (unsigned long *)xen_start_info->mfn_list,
+ xen_start_info->nr_pages * sizeof(unsigned long));
+ free_bootmem(
+ __pa(xen_start_info->mfn_list),
+ PFN_PHYS(PFN_UP(xen_start_info->nr_pages *
+ sizeof(unsigned long))));
/*
* Initialise the list of the frames that specify the list of
.extent_order = 0,
.domid = DOMID_SELF
};
- set_pte(pte, __pte_ma(0));
+ set_pte_at(&init_mm, addr, pte, __pte_ma(0));
phys_to_machine_mapping[__pa(addr) >> PAGE_SHIFT] =
INVALID_P2M_ENTRY;
BUG_ON(HYPERVISOR_memory_op(
scrub_pages(vstart, 1 << order);
+ balloon_lock(flags);
BUG_ON(generic_page_range(
&init_mm, vstart, PAGE_SIZE << order, dealloc_pte_fn, NULL));
-
- balloon_lock(flags);
current_pages -= 1UL << order;
balloon_unlock(flags);